package com.xukang.qd.util;



import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Semaphore;

/**
 *  *
 *  * @author Administrator
 *  *该程序用来模拟发送命令与执行命令，主线程代表指挥官，新建3个线程代表战士，战士一直等待着指挥官下达命令，
 *  *若指挥官没有下达命令，则战士们都必须等待。一旦命令下达，战士们都去执行自己的任务，指挥官处于等待状态，战士们任务执行完毕则报告给
 *  *指挥官，指挥官则结束等待。
 *  
 */

public class CountExample {

    // 请求总数
    public static int clientTotal = 100;

    // 同时并发执行的线程数
    public static int threadTotal = 10;

    public static int count = 0;

    public static int errorCount = 0;


    public static void main(String[] args) throws Exception {
        ExecutorService executorService = Executors.newCachedThreadPool();
        //信号量，此处用于控制并发的线程数
        final Semaphore semaphore = new Semaphore(threadTotal);
        //闭锁，可实现计数器递减
        final CountDownLatch countDownLatch = new CountDownLatch(clientTotal);
        for (int i = 0; i < clientTotal ; i++) {
            executorService.execute(
                     new Thread(){
                        @Override
                        public void  run() {
                            try {
                                //执行此方法用于获取执行许可，当总计未释放的许可数不超过200时，
                                //允许通行，否则线程阻塞等待，直到获取到许可。
                                semaphore.acquire();
                                add();
                                //释放许可
                                semaphore.release();
                            } catch (Exception e) {
                                //log.error("exception", e);
                                e.printStackTrace();
                            }
                            //闭锁减一
                            countDownLatch.countDown();
                        }});
        }
        countDownLatch.await();//线程阻塞，直到闭锁值为0时，阻塞才释放，继续往下执行
        executorService.shutdown();
        System.out.println("失败量："+errorCount);
    }

    private static void add() {
        String result = HttpClientUtil.sendGet("http://localhost:8080/send/demo");
        System.out.println("返回结果：" + result);
        count++;
        if("fail".equals(result)){
            // 失败，记录数量
            errorCount++;
        }
        System.out.println(count);
    }
}